<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    let arr = [2, 6, 8, 10, 12, 12, 10, 8, 14, 12, 14, 10];
    // console.log(arr);

    //冒泡排序：两两相邻进行比较
    function bubbly(array) {
        let count = 0;//统计执行次数
        let jiaohuan = 0;//统计交换次数
        for (let i = 0; i < array.length - 1; i++) {
            for (let j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    array[j] = array[j] ^ array[j + 1];// 0101  0011   0110
                    array[j + 1] = array[j] ^ array[j + 1];// 0110  0011   0101
                    array[j] = array[j] ^ array[j + 1];// 0110  0101   0011
                    jiaohuan++;
                }
                count++;
            }
        }
        console.log("统计执行次数:" + count);
        console.log("统计交换次数:" + jiaohuan);
    }

    console.log(arr);
    bubbly(arr);
    console.log(arr);

    arr = [2, 6, 8, 10, 12, 12, 10, 8, 14, 12, 14, 10];

    //每次找出当次最小元素的索引，与第一元素交换
    function select(array) {
        let count = 0;//统计执行次数
        let jiaohuan = 0;//统计交换次数
        for (let i = 0; i < array.length - 1; i++) {
            let minIndex = i;//假设i就是最小元素的索引
            for (let j = i + 1; j < array.length; j++) {
                if (array[minIndex] > array[j]) {
                    minIndex = j;
                }
                count++;
            }
            // console.log(`minIndex: ${minIndex}`);
            //交换
            if (minIndex != i) {
                array[minIndex] = array[minIndex] ^ array[i];
                array[i] = array[minIndex] ^ array[i];
                array[minIndex] = array[minIndex] ^ array[i];
                jiaohuan++;
            }
        }
        console.log("统计执行次数:" + count);
        console.log("统计交换次数:" + jiaohuan);
    }

    console.log(arr);
    select(arr);
    console.log(arr);

    arr = [2, 6, 8, 10, 12, 12, 10, 8, 14, 12, 14, 10];

    //假设第一个元素已经是一个有序数组，从第二个元素开始，将要插入的元素，插入到合适的位置上
    function insert(array) {
        let count = 0;//统计执行次数
        let jiaohuan = 0;//统计交换次数
        for (let i = 1; i < array.length; i++) {
            let insertIndex = i;//假设i就是要插入的位置
            let insertItem = array[i];//保存被插入的元素值
            //将大的数据往后移，并且找到合适的位置
            for (let j = i - 1; j >= 0; j--) {//6
                //一定不能使用array[i]，因为下面代码会改变数组的元素位置
                if (insertItem < array[j]) {
                    //比要插入的元素大的元素往后移
                    array[j + 1] = array[j];
                    jiaohuan++;
                    //找出合适的插入位置
                    insertIndex = j;
                } else {
                    break;//发现比插入元素的值小的就跳出
                }
                count++;
            }
            //将数据插入到指定位置上
            array[insertIndex] = insertItem;
            console.log(insertIndex, insertItem);
        }
        console.log("统计执行次数:" + count);
        console.log("统计交换次数:" + jiaohuan);
    }

    console.log(arr);
    insert(arr);
    console.log(arr);
</script>
</body>
</html>